package channels

import (
	"fmt"
	"time"
)

func DemoRateLimiting() {
	//构建通道接受请求
	requests := make(chan int, 5)
	for i := 1; i <= 5; i++ {
		requests <- i
	}
	close(requests)

	//Limiter通道，通过每200毫秒接受一个值，通过速率限制接受请求
	limiter := time.Tick(time.Millisecond * 200)

	//打印处理的请求
	for req := range requests {
		<-limiter
		fmt.Println("request", req, time.Now())
	}

	/*
	 *	有时候我们想临时进行速率限制，并且不影响整体的速率控制我们可以通过通道缓冲来实现。
	 *	这个 burstyLimiter 通道用来进行 3 次临时的脉冲型速率限制。
	 */
	burstyLimiter := make(chan time.Time, 3)

	for i := 0; i < 3; i++ {
		burstyLimiter <- time.Now()
	}

	go func() {
		for t := range time.Tick(time.Millisecond * 200) {
			burstyLimiter <- t
		}
	}()

	burstryRequests := make(chan int, 5)
	for i := 1; i <= 5; i++ {
		burstryRequests <- i
	}

	close(burstryRequests)

	for req := range burstryRequests {
		<-burstyLimiter
		fmt.Println("request", req, time.Now())
	}

}
